package com.geeklan.smart.utils;

public class ThreadTask {

    private ThreadTask() {
        // 私有化构造函数，防止外部实例化
    }

    /**
     * 执行异步任务
     *
     * @param task 需要运行的任务
     */
    public static void execute(Runnable task) {
        new Thread(task).start();
    }

    /**
     * 执行带回调的异步任务
     *
     * @param task     后台任务
     * @param callback 任务完成后的回调
     */
    public static void executeWithCallback(Runnable task, Callback callback) {
        new Thread(() -> {
            try {
                // 执行任务
                task.run();

                // 任务完成后回调成功
                if (callback != null) {
                    callback.onSuccess();
                }
            } catch (Exception e) {
                // 如果发生异常，回调失败
                if (callback != null) {
                    callback.onError(e);
                }
            }
        }).start();
    }

    /**
     * 执行带返回值的异步任务
     *
     * @param task     后台任务
     * @param callback 任务完成后的回调
     * @param <T>      返回值类型
     */
    public static <T> void executeWithResult(Task<T> task, ResultCallback<T> callback) {
        new Thread(() -> {
            try {
                // 执行任务并获取结果
                T result = task.run();

                // 回调成功结果
                if (callback != null) {
                    callback.onSuccess(result);
                }
            } catch (Exception e) {
                // 回调错误信息
                if (callback != null) {
                    callback.onError(e);
                }
            }
        }).start();
    }

    /**
     * 回调接口：任务完成
     */
    public interface Callback {
        void onSuccess();

        void onError(Exception e);
    }

    /**
     * 回调接口：带返回值的任务
     *
     * @param <T> 返回值类型
     */
    public interface ResultCallback<T> {
        void onSuccess(T result);

        void onError(Exception e);
    }

    /**
     * 带返回值的任务接口
     *
     * @param <T> 返回值类型
     */
    public interface Task<T> {
        T run() throws Exception;
    }
}

